iT邦幫忙

2025 iThome 鐵人賽

DAY 8
2
Software Development

30 天 Effective C++ 大挑戰!!系列 第 8

[Day 8] Design and Declarations II

  • 分享至 

  • xImage
  •  

進入 Design and Declarations 章節的後半段。今天工作繁雜,忙得像一顆纏繞打轉的 Yoyo 溜溜球。沒太多精力看書做筆記,這次就言簡意賅地講述重要觀念吧!

22. Declare data members as private

將 class 中所有成員變數聲明為 private,以加強封裝性及安全性。這種方式可以強制使用者僅通過提供的 interface 使用成員,使 class 的內部實現細節與外部程式隔離。如果需要修改 class 的內部結構,外部程式碼只需重新編譯而無需改動。publicprotected 則可對封裝性部分開放。

23. Prefer non-member, non-friend to member functions

將高層級函式儘量設置為非成員函式。低層級函式需要直接訪問 private 成員,而高層級函式只是調用這些低層級函數。將高層級函數移出 class 的好處包括:

  • 保護封裝性,避免未來維護時不小心改動到高層級函式。
  • 增加靈活性,允許從不同角度重構功能,優化依賴關係。 e.g. 拆分到特定的 namespace 中。

24. Declare non-member functions when type conversions should apply to all parameters

在 C++ 中使用 +-*/ 等運算符重載時,如果希望左右兩邊的操作數都能進行隱式轉換,應將該運算符定義為非成員函式,並根據需要設置為 friend 以獲取成員訪問權。

成員函式的左操作數固定為 this 當前對象,不能隱式轉換;而非成員函數的兩個參數都可以被隱式轉換。例如,x + 2 可以轉換,但 2 + x 可能無法正常編譯。這讓自定義類型更像內建類型一樣方便使用。

此外,對單參數建構函式使用 explicit 可禁止隱式轉換。

25. Consider support for a non-throwing swap

swap 函數最初由 STL 引入,是處理異常安全性與解決自賦值問題的關鍵機制。其基本實現透過複製建構與賦值運算,可能導致效率低下且缺乏安全性。對於自定義的 class,應提供更高效且不拋出異常的 swap 實現。

使用下列方式可確保程式的穩定性與高效性,並兼容多種 swap 行為:

  • 提供公有 swap 成員函式,確保交換操作高效並且不拋出異常。
  • 在同一 namespace 下提供非成員 swap 函式,該函式應調用成員函式實現。
  • 如果是 class,可以在裡面調用自定義的 swap 成員函式。
  • 調用 swap 時,先用 using std::swapstd::swap 在 scope 內可見,讓編譯器選擇最適合的實現。

上一篇
[Day 7] Designs and Declarations I
下一篇
[Day 9] 中場休息 Q&A小測驗!!
系列文
30 天 Effective C++ 大挑戰!!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言